/*
 * Título: gestHora. Aplicación web de gestión de horarios para conservatorios.
 * Alumnos:
 * - Javier Pardo Muñoz. I.T. Informática de Gestión
 * - Antonio Prior Cazorla. I.T. Informática de Gestión
 * Director: Dr. José Raúl Romero Salguero.
 *     
 *  Copyright (C) 2013 Javier Pardo Muñoz / Antonio Prior Cazorla
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package es.uco.gesthora.business;

import es.uco.gesthora.business.gestorEmail.GestorEmail;
import es.uco.gesthora.business.gestorRutas.GestorRutas;
import es.uco.gesthora.data.DAO.DAOUsuario;
import es.uco.gesthora.interfaz.UsuarioBean;
import java.util.Hashtable;
import java.util.Random;
import java.util.Vector;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;

/**
 * Maneja la capa lógica del rol usuario.
 *
 * @author Javier Pardo Muñoz / Antonio Prior Cazorla
 *
 */
public class Usuario {

    private static Usuario instance = new Usuario();
    private String path = GestorRutas.getInstance().getWebInfPath();
    private UsuarioBean infoUsuario = null;
    private DAOUsuario dUsuario = null;

    /**
     * Constructor por defecto de la clase
     */
    private Usuario() {
        infoUsuario = new UsuarioBean();
        dUsuario = DAOUsuario.getInstance();
    }

    /**
     * Devuelve una instancia de la clase usando el patrón Singleton
     *
     * @return Instancia de la clase Alumno
     */
    public static Usuario getInstance() {
        return instance;
    }

    /**
     * Comprueba si existe un usuario en la base de datos que permita iniciar
     * sesión
     *
     * @param usuario: nombre de usuario
     * @param password: password del usuario
     * @return Si el usuario existe devuelve el rol / Si el usuario no existe
     * devuelve la cadena "NoExiste" / Si el usuario no ha activado su cuenta
     * devuelve la cadena "Inactivo"
     */
    public String iniciaSesion(String usuario, String password) {

        Vector resultado = new Vector();
        Hashtable item = null;

        //Rellena el bean de usuario
        infoUsuario.setUsuario(usuario);
        infoUsuario.setPassword(password);

        //Busca ese usuario en la base de datos
        resultado = dUsuario.seleccionaUsuarioPassword(infoUsuario);

        /*Si existe un usuario comienza el proceso de login */
        if (!resultado.isEmpty()) {

            /*Comprueba si el usuario está activo*/
            resultado = dUsuario.usuarioActivo(infoUsuario);

            if (!resultado.isEmpty()) {

                //Devuelve el rol si existe el usuario
                item = (Hashtable) resultado.get(0);
                return (String) item.get("rol");

            } else {
                //Devuelve "Inactivo" si el usuario no se ha activado
                return "Inactivo";
            }
        }

        //Devuelve "NoExiste" si el usuario no se encuentra en la base de datos
        return "NoExiste";

    }

    /**
     * Realiza todas las operaciones lógicas necesarias para activar la cuenta
     * del usuario
     *
     * @param codActivacion: código de activación enviado por email al alumno
     * @return
     */
    public boolean activar(String codActivacion) {
        int iresultado = 0;

        try {
            iresultado = dUsuario.activar(codActivacion);
        } catch (Exception e) {
        }

        if (iresultado != 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para crear una nueva
     * contraseña para los usuarios que la hayan olvidado
     *
     * @param email: email del usuario
     * @return true si se ha creado una nueva password / false si ha fallado
     * @throws AddressException
     * @throws MessagingException
     */
    public boolean recordarPassword(String email) throws AddressException, MessagingException {

        String newPassword = new String();
        Vector aux = new Vector();
        Hashtable item = null;
        int resultado = 0;

        //Se crea una contraseña aleatoria
        long milis = new java.util.GregorianCalendar().getTimeInMillis();
        Random r = new Random(milis);
        int i = 0;
        while (i < 10) { //Longitud de la cadena 10
            char c = (char) r.nextInt(255);
            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')) {
                newPassword += c;
                i++;
            }
        }

        infoUsuario.setPassword(newPassword);
        infoUsuario.setEmail(email);

        //Busca el usuario con ese email en la base de datos
        aux = dUsuario.seleccionaPorEmail(infoUsuario);

        //Si existe el email entonces se envia un correo con la nueva contraseña 
        if (!aux.isEmpty()) {

            item = (Hashtable) aux.get(0);
            infoUsuario.setUsuario((String) item.get("nombreUsuario"));

            //Modifica al usuario
            resultado = dUsuario.modificar(infoUsuario);

            if (resultado != 0) {

                //Si se modifica correctamente envía un email
                GestorEmail gestorEmail = new GestorEmail(path, "DatosAplicacion.properties");
                String s = infoUsuario.getUsuario();
                String asunto = new String("gestHora: Nueva contraseña de usuario " + s);
                String cuerpo = new String("Recibe este correo debido a que ha solicitado una nueva contraseña del sistema gestHora.\n\n"
                        + "Esta es su nueva contraseña " + newPassword + "\n\n" + "Recuerde cambiarla desde su panel de control");

                gestorEmail.enviarEmail(email, asunto, cuerpo);

                return true;
            }
        }

        return false;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para modificar la
     * información del usuario desde su panel de control
     *
     * @param email: nuevo email del usuario
     * @param password: nueva password del usuario
     * @return
     */
    public boolean panelControl(String email, String password) {

        Vector aux = new Vector();
        Hashtable item = null;
        int resultado = 0;

        //Se rellena el bean con los nuevos datos
        infoUsuario.setPassword(password);
        infoUsuario.setEmail(email);

        //Modifica al usuario
        resultado = dUsuario.modificar(infoUsuario);

        if (resultado != 0) {
            return true;
        }

        return false;
    }

    /**
     * Recoge el email de un usuario
     *
     * @param nombreUsuario: nombre de usuario
     * @return El email de un usuario concreto.
     */
    public String BurcarEmail(String nombreUsuario) {
        Vector v = null;
        String resultado = "";
        Hashtable item = new Hashtable();
        v = dUsuario.seleccionarEmail(nombreUsuario);
        if (!v.isEmpty()) {
            item = (Hashtable) v.get(0);
            resultado = (String) item.get("email");
        }
        return resultado;
    }
}